home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.4)
-
- '''Tests for binary operators on subtypes of built-in types.'''
- import unittest
- from test import test_support
-
- def gcd(a, b):
- """Greatest common divisor using Euclid's algorithm."""
- while a:
- a = b % a
- b = a
- return b
-
-
- def isint(x):
- '''Test whether an object is an instance of int or long.'''
- if not isinstance(x, int):
- pass
- return isinstance(x, long)
-
-
- def isnum(x):
- '''Test whether an object is an instance of a built-in numeric type.'''
- for T in (int, long, float, complex):
- if isinstance(x, T):
- return 1
- continue
-
- return 0
-
-
- def isRat(x):
- '''Test wheter an object is an instance of the Rat class.'''
- return isinstance(x, Rat)
-
-
- class Rat(object):
- '''Rational number implemented as a normalized pair of longs.'''
- __slots__ = [
- '_Rat__num',
- '_Rat__den']
-
- def __init__(self, num = 0x0L, den = 0x1L):
- '''Constructor: Rat([num[, den]]).
-
- The arguments must be ints or longs, and default to (0, 1).'''
- if not isint(num):
- raise TypeError, 'Rat numerator must be int or long (%r)' % num
-
- if not isint(den):
- raise TypeError, 'Rat denominator must be int or long (%r)' % den
-
- if den == 0:
- raise ZeroDivisionError, 'zero denominator'
-
- g = gcd(den, num)
- self._Rat__num = long(num // g)
- self._Rat__den = long(den // g)
-
-
- def _get_num(self):
- """Accessor function for read-only 'num' attribute of Rat."""
- return self._Rat__num
-
- num = property(_get_num, None)
-
- def _get_den(self):
- """Accessor function for read-only 'den' attribute of Rat."""
- return self._Rat__den
-
- den = property(_get_den, None)
-
- def __repr__(self):
- '''Convert a Rat to an string resembling a Rat constructor call.'''
- return 'Rat(%d, %d)' % (self._Rat__num, self._Rat__den)
-
-
- def __str__(self):
- '''Convert a Rat to a string resembling a decimal numeric value.'''
- return str(float(self))
-
-
- def __float__(self):
- '''Convert a Rat to a float.'''
- return self._Rat__num * 1.0 / self._Rat__den
-
-
- def __int__(self):
- '''Convert a Rat to an int; self.den must be 1.'''
- if self._Rat__den == 1:
-
- try:
- return int(self._Rat__num)
- except OverflowError:
- raise OverflowError, '%s too large to convert to int' % repr(self)
- except:
- None<EXCEPTION MATCH>OverflowError
-
-
- None<EXCEPTION MATCH>OverflowError
- raise ValueError, "can't convert %s to int" % repr(self)
-
-
- def __long__(self):
- '''Convert a Rat to an long; self.den must be 1.'''
- if self._Rat__den == 1:
- return long(self._Rat__num)
-
- raise ValueError, "can't convert %s to long" % repr(self)
-
-
- def __add__(self, other):
- '''Add two Rats, or a Rat and a number.'''
- if isint(other):
- other = Rat(other)
-
- if isRat(other):
- return Rat(self._Rat__num * other._Rat__den + other._Rat__num * self._Rat__den, self._Rat__den * other._Rat__den)
-
- if isnum(other):
- return float(self) + other
-
- return NotImplemented
-
- __radd__ = __add__
-
- def __sub__(self, other):
- '''Subtract two Rats, or a Rat and a number.'''
- if isint(other):
- other = Rat(other)
-
- if isRat(other):
- return Rat(self._Rat__num * other._Rat__den - other._Rat__num * self._Rat__den, self._Rat__den * other._Rat__den)
-
- if isnum(other):
- return float(self) - other
-
- return NotImplemented
-
-
- def __rsub__(self, other):
- '''Subtract two Rats, or a Rat and a number (reversed args).'''
- if isint(other):
- other = Rat(other)
-
- if isRat(other):
- return Rat(other._Rat__num * self._Rat__den - self._Rat__num * other._Rat__den, self._Rat__den * other._Rat__den)
-
- if isnum(other):
- return other - float(self)
-
- return NotImplemented
-
-
- def __mul__(self, other):
- '''Multiply two Rats, or a Rat and a number.'''
- if isRat(other):
- return Rat(self._Rat__num * other._Rat__num, self._Rat__den * other._Rat__den)
-
- if isint(other):
- return Rat(self._Rat__num * other, self._Rat__den)
-
- if isnum(other):
- return float(self) * other
-
- return NotImplemented
-
- __rmul__ = __mul__
-
- def __truediv__(self, other):
- '''Divide two Rats, or a Rat and a number.'''
- if isRat(other):
- return Rat(self._Rat__num * other._Rat__den, self._Rat__den * other._Rat__num)
-
- if isint(other):
- return Rat(self._Rat__num, self._Rat__den * other)
-
- if isnum(other):
- return float(self) / other
-
- return NotImplemented
-
- __div__ = __truediv__
-
- def __rtruediv__(self, other):
- '''Divide two Rats, or a Rat and a number (reversed args).'''
- if isRat(other):
- return Rat(other._Rat__num * self._Rat__den, other._Rat__den * self._Rat__num)
-
- if isint(other):
- return Rat(other * self._Rat__den, self._Rat__num)
-
- if isnum(other):
- return other / float(self)
-
- return NotImplemented
-
- __rdiv__ = __rtruediv__
-
- def __floordiv__(self, other):
- '''Divide two Rats, returning the floored result.'''
- if isint(other):
- other = Rat(other)
- elif not isRat(other):
- return NotImplemented
-
- x = self / other
- return x._Rat__num // x._Rat__den
-
-
- def __rfloordiv__(self, other):
- '''Divide two Rats, returning the floored result (reversed args).'''
- x = other / self
- return x._Rat__num // x._Rat__den
-
-
- def __divmod__(self, other):
- '''Divide two Rats, returning quotient and remainder.'''
- if isint(other):
- other = Rat(other)
- elif not isRat(other):
- return NotImplemented
-
- x = self // other
- return (x, self - other * x)
-
-
- def __rdivmod__(self, other):
- '''Divide two Rats, returning quotient and remainder (reversed args).'''
- if isint(other):
- other = Rat(other)
- elif not isRat(other):
- return NotImplemented
-
- return divmod(other, self)
-
-
- def __mod__(self, other):
- '''Take one Rat modulo another.'''
- return divmod(self, other)[1]
-
-
- def __rmod__(self, other):
- '''Take one Rat modulo another (reversed args).'''
- return divmod(other, self)[1]
-
-
- def __eq__(self, other):
- '''Compare two Rats for equality.'''
- if isint(other):
- if self._Rat__den == 1:
- pass
- return self._Rat__num == other
-
- if isRat(other):
- if self._Rat__num == other._Rat__num:
- pass
- return self._Rat__den == other._Rat__den
-
- if isnum(other):
- return float(self) == other
-
- return NotImplemented
-
-
- def __ne__(self, other):
- '''Compare two Rats for inequality.'''
- return not (self == other)
-
-
-
- class RatTestCase(unittest.TestCase):
- '''Unit tests for Rat class and its support utilities.'''
-
- def test_gcd(self):
- self.assertEqual(gcd(10, 12), 2)
- self.assertEqual(gcd(10, 15), 5)
- self.assertEqual(gcd(10, 11), 1)
- self.assertEqual(gcd(100, 15), 5)
- self.assertEqual(gcd(-10, 2), -2)
- self.assertEqual(gcd(10, -2), 2)
- self.assertEqual(gcd(-10, -2), -2)
- for i in range(1, 20):
- for j in range(1, 20):
- self.assert_(gcd(i, j) > 0)
- self.assert_(gcd(-i, j) < 0)
- self.assert_(gcd(i, -j) > 0)
- self.assert_(gcd(-i, -j) < 0)
-
-
-
-
- def test_constructor(self):
- a = Rat(10, 15)
- self.assertEqual(a.num, 2)
- self.assertEqual(a.den, 3)
- a = Rat(0xAL, 0xFL)
- self.assertEqual(a.num, 2)
- self.assertEqual(a.den, 3)
- a = Rat(10, -15)
- self.assertEqual(a.num, -2)
- self.assertEqual(a.den, 3)
- a = Rat(-10, 15)
- self.assertEqual(a.num, -2)
- self.assertEqual(a.den, 3)
- a = Rat(-10, -15)
- self.assertEqual(a.num, 2)
- self.assertEqual(a.den, 3)
- a = Rat(7)
- self.assertEqual(a.num, 7)
- self.assertEqual(a.den, 1)
-
- try:
- a = Rat(1, 0)
- except ZeroDivisionError:
- pass
-
- self.fail("Rat(1, 0) didn't raise ZeroDivisionError")
- for bad in ('0', 0.0, (0.0+0.0j), (), [], { }, None, Rat, unittest):
-
- try:
- a = Rat(bad)
- except TypeError:
- pass
-
- self.fail("Rat(%r) didn't raise TypeError" % bad)
-
- try:
- a = Rat(1, bad)
- except TypeError:
- continue
-
- self.fail("Rat(1, %r) didn't raise TypeError" % bad)
-
-
-
- def test_add(self):
- self.assertEqual(Rat(2, 3) + Rat(1, 3), 1)
- self.assertEqual(Rat(2, 3) + 1, Rat(5, 3))
- self.assertEqual(1 + Rat(2, 3), Rat(5, 3))
- self.assertEqual(1.0 + Rat(1, 2), 1.5)
- self.assertEqual(Rat(1, 2) + 1.0, 1.5)
-
-
- def test_sub(self):
- self.assertEqual(Rat(7, 2) - Rat(7, 5), Rat(21, 10))
- self.assertEqual(Rat(7, 5) - 1, Rat(2, 5))
- self.assertEqual(1 - Rat(3, 5), Rat(2, 5))
- self.assertEqual(Rat(3, 2) - 1.0, 0.5)
- self.assertEqual(1.0 - Rat(1, 2), 0.5)
-
-
- def test_mul(self):
- self.assertEqual(Rat(2, 3) * Rat(5, 7), Rat(10, 21))
- self.assertEqual(Rat(10, 3) * 3, 10)
- self.assertEqual(3 * Rat(10, 3), 10)
- self.assertEqual(Rat(10, 5) * 0.5, 1.0)
- self.assertEqual(0.5 * Rat(10, 5), 1.0)
-
-
- def test_div(self):
- self.assertEqual(Rat(10, 3) / Rat(5, 7), Rat(14, 3))
- self.assertEqual(Rat(10, 3) / 3, Rat(10, 9))
- self.assertEqual(2 / Rat(5), Rat(2, 5))
- self.assertEqual(3.0 * Rat(1, 2), 1.5)
- self.assertEqual(Rat(1, 2) * 3.0, 1.5)
-
-
- def test_floordiv(self):
- self.assertEqual(Rat(10) // Rat(4), 2)
- self.assertEqual(Rat(10, 3) // Rat(4, 3), 2)
- self.assertEqual(Rat(10) // 4, 2)
- self.assertEqual(10 // Rat(4), 2)
-
-
- def test_eq(self):
- self.assertEqual(Rat(10), Rat(20, 2))
- self.assertEqual(Rat(10), 10)
- self.assertEqual(10, Rat(10))
- self.assertEqual(Rat(10), 10.0)
- self.assertEqual(10.0, Rat(10))
-
-
- def test_future_div(self):
- exec future_test
-
-
- future_test = "\nfrom __future__ import division\nself.assertEqual(Rat(10, 3) / Rat(5, 7), Rat(14, 3))\nself.assertEqual(Rat(10, 3) / 3, Rat(10, 9))\nself.assertEqual(2 / Rat(5), Rat(2, 5))\nself.assertEqual(3.0 * Rat(1, 2), 1.5)\nself.assertEqual(Rat(1, 2) * 3.0, 1.5)\nself.assertEqual(eval('1/2'), 0.5)\n"
-
- def test_main():
- test_support.run_unittest(RatTestCase)
-
- if __name__ == '__main__':
- test_main()
-
-